home *** CD-ROM | disk | FTP | other *** search
- #!/bin/sh
- # Copyright (C) 2006 Osamu Aoki <osamu@debian.org>
- # Copyright (C) 2005 - 2006 Kenshi Muto <kmuto@debian.org>
- # Modified for Debian package.
- # Copyright (C) 1999 - 2004 Red Hat, Inc. All rights reserved. This
- # copyrighted material is made available to anyone wishing to use, modify,
- # copy, or redistribute it subject to the terms and conditions of the
- # GNU General Public License version 2.
- #
- # You should have received a copy of the GNU General Public License
- # along with this program; if not, write to the Free Software
- # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- # system wide configuration directory
- XINPUT_PATH=/etc/X11/xinit/xinput.d
- # user specific customization directory
- DOTXINPUT_PATH=${HOME}/.xinput.d
- # All im-switch related alternatives start with xinput-
- ALTER_XINPUT=/etc/alternatives/xinput-
- # location for special hook scripts installed by each IM packages
- HOOKDIR=/usr/share/im-switch
-
- # $LNG is locale <languag>e_<region> without .<encoding> and .<encoding>@EURO
- LNG=${LC_ALL:-${LC_CTYPE:-${LANG}}}
- LNG=${LNG%@*}
- LNG=${LNG%.*}
-
- [ -z "$LNG" ] && LNG="all_ALL" || true
-
- USERID=$(id -u)
- VER=0.3+debian1.10
-
- VERBOSE=0
-
- # echo to STDERR when VERBOSE is on.
- vecho() {
- if [ $VERBOSE -eq 1 ] ; then
- echo "$1" >&2
- fi
- }
-
- # echo local setups to STDERR when VERBOSE is on.
- vlang() {
- if [ $VERBOSE -eq 1 ] ; then
- echo "LC_ALL=\"$LC_ALL\"" >&2
- echo "LC_CTYPE=\"$LC_CTYPE\"" >&2
- echo "LANG=\"$LANG\"" >&2
- echo "LNG=\"$LNG\"" >&2
- fi
- }
-
- # echo command line info to STDERR when VERBOSE is on.
- errcmd() {
- echo "Error: \"${0##*/}\" invoked with \"$ORGAT\" as options." >&2
- echo "Error: Try \"${0##*/} -h\" for usage." >&2
- }
-
- # echo missing dependency information for $1=$LNG
- dependency() {
- if [ -z "$1" ] ; then
- return
- fi
- if [ -r ${HOME}/$(basename "$1") ]; then
- DEPENDS=$(grep -e "DEPENDS=" ${HOME}/$(basename $1) | sed -e 's/DEPENDS=//' -e 's/"//g')
- elif [ -r "${XINPUT_PATH}/$1" ]; then
- DEPENDS=$(grep -e "DEPENDS=" $XINPUT_PATH/$1 | sed -e 's/DEPENDS=//' -e 's/"//g')
- else
- DEPENDS=""
- fi
- vecho "From the package dependency information requires"
- vecho " \"$DEPENDS\"."
- if [ -z "$DEPENDS" ]; then
- return
- fi
- RESULT=""
- # split with ","
- IFS=","
- for i in `echo "$DEPENDS"`; do
- INSTALLED=0
- # split with |
- IFS="|"
- for j in `echo "$i"`; do
- unset IFS
- vecho "checking status of \"$j\" package"
- if dpkg -s $j 2>/dev/null | grep -q -e "Status: install ok installed" ; then
- vecho "+++ \"$j\" package is installed."
- INSTALLED=1
- else
- vecho "---- \"$j\" package is NOT installed."
- fi
- done
- done
- if [ $INSTALLED -eq 0 ]; then
- if [ -z "$RESULT" ]; then
- RESULT="( $i )"
- else
- RESULT="${RESULT} and ( $i )"
- fi
- fi
- if [ -n "$RESULT" ]; then
- echo "Please install following packages:"
- echo " $(echo \"$RESULT\" | sed -e 's/|/ or /g') ."
- fi
- }
-
- # echo current system wide default IM setup name
- current_system_im () {
- if [ -r "${ALTER_XINPUT}${LNG}" ]; then
- /usr/sbin/update-alternatives --display xinput-$LNG | \
- sed -ne 's/ link currently points to \(.*\)/\1/p' | \
- sed -e "s%${XINPUT_PATH}/%%"
- elif [ -r "${ALTER_XINPUT}all_ALL" ]; then
- /usr/sbin/update-alternatives --display xinput-all_ALL | \
- sed -ne 's/ link currently points to \(.*\)/\1/p' | \
- sed -e "s%${XINPUT_PATH}/%%"
- else
- echo "No system wide default \"${ALTER_XINPUT}${LNG} or ${ALTER_XINPUT}all_ALL\" is defined."
- exit 1
- fi
- }
-
- # echo current user IM setup name
- current_user_im () {
- readlink ${DOTXINPUT_PATH}/$LNG | \
- sed -e "s%${XINPUT_PATH}/%%" -e "s%${DOTXINPUT_PATH}/%~/.xinput.d/%"
- }
-
- # echo IM setup candidates
- possible_im () {
- ( (/usr/bin/find $XINPUT_PATH -type f| sed -e "s%$XINPUT_PATH/%%") ; \
- (/usr/bin/find $DOTXINPUT_PATH -type f| sed -e "s%$DOTXINPUT_PATH/%%" ; ) ) | \
- sort -u
- # XXX FIXME : should test for executable
- }
-
- # run system hook script when system wide IM setup is changed
- # So far, I have not see its use yet.
- # $PREVIOUS
- # $DEFAULT
- runhookscripts () {
- if [ "$DEFAULT" != "$PREVIOUS" ]; then
- [ "$PREVIOUS" -a -x "$HOOKDIR/$PREVIOUS" ] && $HOOKDIR/$PREVIOUS remove
- [ "$DEFAULT" -a -x "$HOOKDIR/$DEFAULT" ] && $HOOKDIR/$DEFAULT install
- fi
- }
-
- list() {
- echo "Your input method setup under $LNG locale as below."
- echo "======================================================="
- if [ "$USERID" -eq 0 ]; then
- echo "No private configuration can be defined for root account."
- elif [ -r "${DOTXINPUT_PATH}/${LNG}" ]; then
- if [ -L "${DOTXINPUT_PATH}/${LNG}" ]; then
- echo "The configuration \"${DOTXINPUT_PATH}/${LNG}\" is defined as a link pointing to"
- echo "$(basename $(readlink "${DOTXINPUT_PATH}/${LNG}"))"
- else
- echo "The private configuration is a static file \"${DOTXINPUT_PATH}/${LNG}\" ."
- fi
- echo "This private configuration supersedes the system wide default."
- elif [ -L "${DOTXINPUT_PATH}/all_ALL" ]; then
- if [ -L "${DOTXINPUT_PATH}/all_ALL" ]; then
- echo "The configuration \"${DOTXINPUT_PATH}/all_ALL\" is defined as a link pointing to"
- echo "$(basename $(readlink "${DOTXINPUT_PATH}/all_ALL"))"
- else
- echo "The private configuration is a static file \"${DOTXINPUT_PATH}/all_ALL\" ."
- fi
- echo "This private configuration supersedes the system wide default."
- else
- echo "No private \"${DOTXINPUT_PATH}/${LNG} or ${DOTXINPUT_PATH}/all_ALL\" is defined."
- fi
- echo "======================================================="
- if [ -r "${ALTER_XINPUT}${LNG}" ]; then
- echo "The system wide default is pointed by \"${ALTER_XINPUT}${LNG}\" ."
- /usr/sbin/update-alternatives --display xinput-$LNG | sed -e "s%$XINPUT_PATH/%%"
- elif [ -r "${ALTER_XINPUT}all_ALL" ]; then
- echo "The system wide default is pointed by \"${ALTER_XINPUT}all_ALL\" ."
- /usr/sbin/update-alternatives --display xinput-all_ALL | sed -e "s%$XINPUT_PATH/%%"
- else
- echo "No system wide default \"${ALTER_XINPUT}${LNG} or ${ALTER_XINPUT}all_ALL\" is defined."
- fi
- vecho "======================================================="
- vecho "The system wide default input methods are available for the locales:"
- for i in `/bin/ls $ALTER_XINPUT* | sed -e "s%$ALTER_XINPUT%%"`; do
- vecho -n "$i "
- done
- vecho
- echo "======================================================="
- echo "The available input method configuration files are:"
- for i in `possible_im` ; do
- if [ -r $DOTXINPUT_PATH/$i ]; then
- echo -n "~/.xinput.d/$i "
- else
- echo -n "$i "
- fi
- done
- echo
- vecho "======================================================="
- vecho "The available input method hook scripts are in $HOOKDIR:"
- for i in `/usr/bin/find $HOOKDIR -type f| sed -e "s%$HOOKDIR/%%"`; do
- vecho -n "$i "
- done
- vecho
- echo "======================================================="
- }
-
- # set IM to defaults
- auto() {
- if [ "$USERID" -eq 0 ]; then
- if [ ! -r "${ALTER_XINPUT}${LNG}" ]; then
- echo "No system wide default defined just for locale ${LNG} ."
- echo "Use \"all_ALL\" quasi-locale and set IM."
- LNG="all_ALL"
- fi
- PREVIOUS=$(current_system_im)
- /usr/sbin/update-alternatives --auto xinput-$LNG
- else
- if [ -r "${DOTXINPUT_PATH}/${LNG}" ]; then
- PREVIOUS=$(current_user_im)
- mv ${DOTXINPUT_PATH}/${LNG} ${DOTXINPUT_PATH}/${LNG}.backup
- fi
- fi
- DEFAULT=$(current_system_im)
- dependency $DEFAULT
- runhookscripts
- }
-
- # set im setup pointing to to $1 script in $XINPUT_PATH
- setalt() {
- if [ "$USERID" -eq 0 ]; then
- vecho "You are root user."
- # sanity check
- if [ ! -r "$XINPUT_PATH/$1" ] ; then
- echo "Error: no system wide configuration file \"$1\" exists." >&2
- echo "Error: No action taken." >&2
- exit 1
- fi
- if [ ! -r "${ALTER_XINPUT}${LNG}" ]; then
- echo "No system wide default defined just for locale $LNG ."
- echo "Use \"all_ALL\" quasi-locale and set IM."
- LNG="all_ALL"
- fi
- PREVIOUS=$(current_system_im)
- /usr/sbin/update-alternatives --set xinput-$LNG $XINPUT_PATH/${1}
- DEFAULT=$(current_system_im)
- vecho "Changed system wide default from $PREVIOUS to $DEFAULT."
- else
- # sanity check
- if [ ! -r "$XINPUT_PATH/${1}" -a ! -r "$DOTXINPUT_PATH/${1}" ] ; then
- echo "Error: no configuration file \"${1}\" exists." >&2
- echo "Error: No action taken." >&2
- exit 1
- fi
- vecho "You are non-root user."
- if [ ! -d ${DOTXINPUT_PATH} ]; then
- mkdir -p ${DOTXINPUT_PATH}
- vecho "Creating ${DOTXINPUT_PATH} directory."
- fi
- if [ -r "${DOTXINPUT_PATH}/${LNG}" ]; then
- PREVIOUS=$(current_user_im)
- mv ${DOTXINPUT_PATH}/${LNG} ${DOTXINPUT_PATH}/${LNG}.backup
- vecho "Backed up user configuration pointing to $PREVIOUS."
- fi
- if [ -r "$DOTXINPUT_PATH/${1}" ] ; then
- ln -s $DOTXINPUT_PATH/${1} ${DOTXINPUT_PATH}/$LNG
- else
- ln -s $XINPUT_PATH/${1} ${DOTXINPUT_PATH}/$LNG
- fi
- DEFAULT=$(current_user_im)
- vecho "Set user configuration pointing to $DEFAULT."
- fi
- dependency "$DEFAULT"
- runhookscripts
- }
-
- # set im setup pointing to to a script in $XINPUT_PATH by menu
- cfgalt() {
- if [ "$USERID" -eq 0 ]; then
- vecho "You are root user."
- if [ ! -r "${ALTER_XINPUT}${LNG}" ]; then
- echo "No system wide default defined just for locale $LNG ."
- echo "Use \"all_ALL\" quasi-locale and set IM."
- LNG="all_ALL"
- fi
- PREVIOUS=$(current_system_im)
- echo "System wide default for ${LNG} locale is marked with [+]."
- /usr/sbin/update-alternatives --config xinput-$LNG
- DEFAULT=$(current_system_im)
- vecho "Changed system wide default from $PREVIOUS to $DEFAULT."
- else
- vecho "You are non-root user."
- if [ ! -d ${DOTXINPUT_PATH} ]; then
- mkdir -p ${DOTXINPUT_PATH}
- vecho "Creating ${DOTXINPUT_PATH} directory."
- fi
- PREVIOUS_SYS=$(current_system_im)
- if [ -r "${DOTXINPUT_PATH}/${LNG}" ]; then
- PREVIOUS_USR=$(current_user_im)
- cp -a ${DOTXINPUT_PATH}/${LNG} ${DOTXINPUT_PATH}/${LNG}.backup
- vecho "Backed up user configuration pointing to $PREVIOUS."
- fi
- vecho " PREVIOUS_SYS=\"$PREVIOUS_SYS\""
- vecho " PREVIOUS_USR=\"$PREVIOUS_USR\""
- COUNT=`possible_im | wc -l`
- echo
- echo "There are $COUNT candidates which provide IM for ${DOTXINPUT_PATH}/${LNG}:"
- echo
- echo " Selection Alternative"
- echo " -----------------------------------------------"
- INDEX=0
- for i in `possible_im`; do
- INDEX=$(($INDEX+1))
- if [ -r $DOTXINPUT_PATH/$i ]; then
- if [ "$PREVIOUS_USR" = "~/.xinput.d/$i" ]; then
- echo -n "*"
- else
- echo -n " "
- fi
- if [ "$PREVIOUS_SYS" = "~/.xinput.d/$i" ]; then
- echo -n "+"
- else
- echo -n " "
- fi
- echo " $INDEX ~/.xinput.d/$i "
- else
- if [ "$PREVIOUS_USR" = "$i" ]; then
- echo -n "*"
- else
- echo -n " "
- fi
- if [ "$PREVIOUS_SYS" = "$i" ]; then
- echo -n "+"
- else
- echo -n " "
- fi
- echo " $INDEX $i"
- fi
- done
- echo "System wide default for ${LNG} (or all_ALL) locale is marked with [+]."
- echo -n "Press enter to keep the current selection[*], or type selection number: "
- read SEL
- echo
- if [ -z "$SEL" ]; then
- SEL=0
- fi
- INDEX=0
- for i in `possible_im`; do
- INDEX=$(($INDEX+1))
- if [ "$SEL" -eq "$INDEX" ]; then
- if [ -r "$DOTXINPUT_PATH/$i" ] ; then
- ln -fs $DOTXINPUT_PATH/$i ${DOTXINPUT_PATH}/$LNG
- else
- ln -fs $XINPUT_PATH/$i ${DOTXINPUT_PATH}/$LNG
- fi
- fi
- done
- fi
- DEFAULT=$(current_user_im)
- vecho "Set user configuration pointing to $DEFAULT."
- dependency "$DEFAULT"
- runhookscripts
- }
-
- help() {
- echo "Input Method Switcher $VER"
- echo ""
- echo "\"${0##*/}\" configures the input method to be automatically switched based "
- echo "on the locale (ll_CC) using Debian \"update-alternatives\" mechanism."
- echo "When \"${0##*/}\" is invoked from root user, it sets system wide alternatives."
- echo ""
- echo "Usage: ${0##*/} [-v][-z ll_CC] -s inputmethodname"
- echo " to set a specific input method for the language"
- echo " ${0##*/} [-v][-z ll_CC] -c"
- echo " to set an input method for the language by menu"
- echo " ${0##*/} [-v][-z ll_CC] -a"
- echo " to revert to the default input method for the language"
- echo " ${0##*/} [-v][-z ll_CC] -l"
- echo " to list current settings and available input methods for"
- echo " the language, and also all the available languages"
- echo " ${0##*/} -h"
- echo " to show this help"
- echo ""
- echo "The \"ll_CC\" argument of -z takes the form \"<language>_<teritory>\" and "
- echo "is used to override the current locale (ISO 639 / ISO 3188) : eg \"-z ja_JP\""
- echo ""
- echo "The use of -v option produces verbose outputs."
- echo ""
- }
-
- ORGAT="$@"
-
- while getopts "vfz:als:ch" OPTION; do
- case $OPTION in
- v) VERBOSE=1;;
- z) vlang; LNG="$OPTARG"; LNG=${LNG%@*}; LNG=${LNG%.*};;
- a) vlang; auto; exit 0;;
- l) vlang; list; exit 0;;
- s) vlang; setalt "$OPTARG"; exit 0;;
- c) vlang; cfgalt; exit 0;;
- h) vlang; help; exit 0;;
- ?) errcmd; exit 1;;
- esac
- done
-
- # If no option or only with -d or/and -z
- errcmd
- exit 1
-